package com.huluspace.learnhub.model;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

@Data
@AllArgsConstructor // 生成全参构造器（业务代码可用）
@NoArgsConstructor
@Entity             // JPA实体类
@Table(name = "users") // 映射的数据库表名
public class User {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY) // 主键自增
  private Long id;
  @Column(nullable = false, unique = true) // 非空且唯一
  private String username; // 用户名
  @Column(nullable = false)
  private String password; // 密码
  @Column(nullable = false)
  private boolean enabled; // 状态
  @Column(nullable = false, updatable = false)
  private LocalDateTime createdAt; // 创建时间
  @Column(nullable = false)
  private LocalDateTime updatedAt; // 更新时间

  @Enumerated(EnumType.STRING) // 存储为枚举名，如 "MALE"
  @Column
  private Gender gender; // 性别
  @Column(name = "birth_date")
  private LocalDate birthDate; // 生日
  @Column
  private String email; // 邮箱
  @Column
  private String phone; // 手机号码
  @Column
  private String address; // 住址
  @Column
  private String realName; // 真实姓名
  @Column
  private String avatar; // 头像

  @ManyToMany(fetch = FetchType.LAZY)
  @JoinTable(
      name = "user_roles", // 中间表
      joinColumns = @JoinColumn(name = "user_id"), // 当前实体（User）在中间表的外键
      inverseJoinColumns = @JoinColumn(name = "role_id") // 关联实体（Role）在中间表的外键
  )
  private Set<Role> roles = new HashSet<>();

  public List<String> roleNames(){
    return roles.stream()
        .map(Role::getName)
        .toList();
  }

  // 自动设置创建时间、更新时间
  @PrePersist
  protected void onCreate() {
    this.createdAt = LocalDateTime.now();
    this.updatedAt = LocalDateTime.now();
  }
  // 自动设置更新时间
  @PreUpdate
  protected void onUpdate() {
    this.updatedAt = LocalDateTime.now();
  }
}

